package com.qire.common.utils;

import com.opensource.svgaplayer.SVGACallback;
import com.opensource.svgaplayer.SVGADrawable;
import com.opensource.svgaplayer.SVGAImageView;
import com.opensource.svgaplayer.SVGAParser;
import com.opensource.svgaplayer.SVGAParser.ParseCompletion;
import com.opensource.svgaplayer.SVGAVideoEntity;
import com.opensource.svgaplayer.utils.SVGARange;

import java.util.ArrayList;

/**
 * SVGAPlay 操作工具
 */
public class SVGAPlayUtil implements SVGACallback, ParseCompletion {

    public final SVGAParser svgaParser;
    public final SVGAImageView svgaImageView;
    public final ArrayList<PlayNode> playNodeList = new ArrayList<>();

    private int index = 0;
    private PlayNode currentNode;

    private boolean isParse = false;

    public SVGAPlayUtil(SVGAImageView svgaImageView) {
        svgaParser = new SVGAParser(svgaImageView.getContext());
        this.svgaImageView = svgaImageView;
        this.svgaImageView.setCallback(this);
    }

    /**
     * 根据 SVGAPath 添加一个播放动画节点
     * @param path svga 地址
     * @return
     */
    public SVGAPlayUtil addSVGAPath(String path) {
        addSVGAPath(path, PlayNode.UN_LIMIT, false);
        return this;
    }
    public SVGAPlayUtil addSVGAPath(String path, int loopCount) {
        addSVGAPath(path, loopCount, false);
        return this;
    }
    public SVGAPlayUtil addSVGAPath(String path, int loopCount, boolean isPause) {
        playNodeList.add(new PlayNode(path, loopCount, isPause));
        return this;
    }

    /**
     * 开始动画，解析播放存数节点的多个动画
     */
    public void startAnimator() {
        if(isParse) {
            isParse = false;
            svgaImageView.startAnimation();
            return;
        }
        if(playNodeList.isEmpty()) {
            return;
        }
        parseSVGA();
    }

    /**
     * 开始一个指定路径的动画
     * @param path svga 地址
     */
    public void startAnimator(String path) {
        addSVGAPath(path);
        startAnimator();
    }

    /**
     * 停止动画，
     */
    public void stopSVGA() {
        stopSVGA(true);
    }

    /**
     * 停止动画
     * @param force 是否强制停止， true 强制停止， false 非强制停止，需要判定是否将播放节点列表都执行完。
     */
    private void stopSVGA(boolean force) {
        if (svgaImageView.isAnimating() && (force || playNodeList.size() == 0)) {
            svgaImageView.stopAnimation();
            playNodeList.clear();
        }
    }

    /**
     * 暂停动画
     */
    public void pauseSVGA() {
        if (svgaImageView.isAnimating()) {
            svgaImageView.pauseAnimation();
            isParse = true;
        }
    }

    /**
     * 解析加载动画
     */
    private void parseSVGA() {
        if(playNodeList.isEmpty()) {
            stopSVGA(false);
            return;
        }
        if(index >= playNodeList.size()) {
            return;
        }
        currentNode = playNodeList.get(index++);
        svgaParser.decodeFromAssets(currentNode.path, this);
    }


    @Override
    public void onComplete(SVGAVideoEntity svgaVideoEntity) {
        //解析动画成功，到这里才真正的显示动画
        svgaImageView.setLoops(currentNode.loopCount);
        svgaImageView.setImageDrawable(new SVGADrawable(svgaVideoEntity));
        svgaImageView.startAnimation();
    }

    @Override
    public void onError() {
        //如果动画数组列表大于0,移除第一位的动画,继续循环解析
        if (playNodeList.isEmpty()) {
            stopSVGA(false);
            return;
        }

        if(currentNode != null) {
            playNodeList.remove(currentNode);
        }
        parseSVGA();
    }


    @Override
    public void onPause() {
//        System.out.println("SVGACallback  onPause");
    }

    @Override
    public void onRepeat() {
//        System.out.println("SVGACallback  onRepeat");
    }

    @Override
    public void onStep(int i, double v) {
//        System.out.println("SVGACallback  onStep  "+i);
//        svgaLastFrames = i;
    }
//    int svgaLastFrames = 0;
    @Override
    public void onFinished() {
//        System.out.println("SVGACallback  onFinished");
//        if(currentNode.isPause)
//            svgaImageView.stepToFrame(svgaLastFrames,false);
//            svgaImageView.stepToFrame(svgaVideoEntity.getFrames()-1,false);

        if(playNodeList.isEmpty()) {
            return;
        }
        parseSVGA();
    }

    public class PlayNode {

        /**
         * {@link SVGAImageView#play(SVGARange, boolean) SVGAImageView.play} 方法中：<br />
         * {@code animator.repeatCount = if (loops <= 0) 99999 else loops - 1} <br />
         * loop 次数 小于等于 0 即为无限重复
         */
        public static final int UN_LIMIT = -1;

        public final String path;
        public final int loopCount;
        public final boolean isPause;

        public PlayNode(String path, int loopCount, boolean isPause) {
            this.path = path;
            this.loopCount = loopCount;
            this.isPause = isPause;
        }
    }

}
